/**
 * @product: Baldagrid
 * @author: Nicolas Balduzzi
 * @version: 2.0
 * @description: Grilla Jquery + Ajax + PHP
 */

Ajax = {
	url : "",
	type : "post",
	data : {
		pagina : 1,
		ordenado_por : "",
		orden : "ASC",
		limit : 0,
		filtro : ""
	},
	error : function(e) {
		alert("Error con el ajax")
	}
}

Baldagrid = {

	div_contenedora : "",
	ruta_ajax : "",
	valores_orden : Array(),
	lenguaje : "",
	usar_imagenes_css : false,
	datos_serializados : "",
	procesando : "Procesando...",
	filtro : false,
	ajax : Ajax,

	/* MISCELANEAS */
	limpiarDivContenedora : function() {
		$('#' + this.div_contenedora).html("")
	},

	/* GETTERS */
	getDivContenedora : function() {
		alert(this.div_contenedora)
	},
	getRutaAjax : function() {
		alert(this.ruta_ajax)
	},
	getLenguaje : function() {
		alert(this.lenguaje)
	},
	getUsarImagenesCss : function() {
		alert(this.usar_imagenes_css)
	},
	getDatosSerializados : function() {
		alert(this.datos_serializados)
	},
	getProcesando : function() {
		alert(this.procesando)
	},
	getAjax : function() {
		alert(this.datos_serializados)
	},

	/* SETTERS */
	setDivContenedora : function(nombre) {
		this.div_contenedora = nombre
	},
	setRutaAjax : function(nombre) {
		this.ruta_ajax = nombre
	},
	setLenguaje : function(lenguaje) {
		this.lenguaje = lenguaje
	},
	setUsarImagenesCss : function(bool) {
		this.usar_imagenes_css = bool
	},
	setDatosSerializados : function(datos) {
		this.datos_serializados = datos
	},
	setProcesando : function(mensaje) {
		this.procesando = mensaje
	},
	setFiltro : function(bool) {
		this.filtro = bool
	},
	setAjax : function() {

		var start = new Date().getTime();
		this.ajax.url = this.ruta_ajax;
		this.ajax.data.pagina = this.paginador.pagina_actual;
		this.ajax.data.ordenado_por = this.tabla.ordenado_por;
		this.ajax.data.orden = this.tabla.orden;
		this.ajax.data.limit = this.paginador.cantidad_registros;
		
		this.ajax.beforeSend = (function() {
			$('#resultado').html(this.procesando);
			Baldagrid.bloqueo.crear();
		});

		this.ajax.success = (function(data) {
			var end = new Date().getTime();
			Baldagrid.resultado.setTiempo(end - start);
			Baldagrid.setDatosSerializados(jQuery.parseJSON(data));
			Baldagrid.generarResultado();
			Baldagrid.bloqueo.destruir();
		});

		$.ajax(this.ajax);
	},
	generarResultado : function() {
		// Se generan las filas con los registros
		Baldagrid.tabla.setDatos();
		// Se crea la tabla
		Baldagrid.tabla.crear();
		// Se crea la grilla
		Baldagrid.paginador.crear();
		// Se establece el resultado
		Baldagrid.resultado.crear();
		// Se destruye la tabla
		Baldagrid.tabla.destruir();
		// Se destruye el paginador
		Baldagrid.paginador.destruir();
	},
	crear : function(div_contenedora, ruta_archivo) {
		// Se configura el lenguaje
		this.setLenguaje(window.navigator.language);
		// Se setea la el id del div que contendrá a la grilla
		if (div_contenedora)
			this.setDivContenedora(div_contenedora);
		// Se setea la ruta del archivo que realiza el ajax
		if (ruta_archivo)
			this.setRutaAjax(ruta_archivo);

		if (this.filtro)
			Baldagrid.tabla.informacion
					.setFiltroValue($('#campo_filtro').val());

		// Se procesa el ajax
		this.setAjax();
	},

	/**
	 * TABLA
	 */
	tabla : {
		clase_css_primero : "primero",
		clase_css_ultimo : "ultimo",
		clase_css_tabla : "datos",
		clase_css_par : "par",
		clase_css_impar : "impar",
		clase_css_orden : "sorted",
		clase_css_filtro : "filtro",
		clase_css_acciones : "acciones",
		ordenado_por : "id",
		orden : "ASC",
		cellpadding : 5,
		cellspacing : 0,
		align : "center",
		width : "100%",
		border : 0,
		columnas : Array(),
		filas : Array(),
		valores_cabecera : Array(),
		acciones : Array(),
		label_sin_resultados : "No se encontraron resultados",
		label_cantidad_registros : "Cantidad de registros: ",
		label_filtro : "Buscar: ",
		uarr : "&uarr;",
		darr : "&darr;",

		/* MISCELANEAS */
		mostrarSinResultados : function() {
			$('#' + Baldagrid.div_contenedora).html(this.label_sin_resultados)
		},
		camelCase : function(palabra) {
			return palabra.substr(0, 1).toUpperCase() + palabra.substr(1)
		},
		quitarGuiones : function(palabra) {
			return this.camelCase(palabra.replace(/_/, ' '))
		},

		/* GETTERS */
		getClaseCssPrimero : function() {
			alert(this.clase_css_primero)
		},
		getClaseCssUltimo : function() {
			alert(this.clase_css_ultimo)
		},
		getClaseCssTabla : function() {
			alert(this.clase_css_tabla)
		},
		getClaseCssPar : function() {
			alert(this.clase_css_par)
		},
		getClaseCssImpar : function() {
			alert(this.clase_css_impar)
		},
		getClaseCssOrden : function() {
			alert(this.clase_css_orden)
		},
		getClaseCssFiltro : function() {
			alert(this.clase_css_filtro)
		},
		getClaseCssAcciones : function() {
			alert(this.clase_css_acciones)
		},
		getCellpadding : function() {
			alert(this.cellpadding)
		},
		getCellspacing : function() {
			alert(this.cellspacing)
		},
		getOrdenadoPor : function() {
			alert(this.ordenado_por)
		},
		getOrden : function() {
			alert(this.orden)
		},
		getAlign : function() {
			alert(this.align)
		},
		getWidth : function() {
			alert(this.width)
		},
		getBorder : function() {
			alert(this.border)
		},
		getLabelSinResultados : function() {
			alert(this.label_sin_resultados)
		},
		getLabelCantidadRegistros : function() {
			alert(this.label_cantidad_registros)
		},
		getLabelFiltro : function() {
			alert(this.label_filtro)
		},
		getColumnas : function() {
			alert(this.columnas)
		},
		getValoresCabecera : function() {
			alert(this.valores_cabecera)
		},
		getUarr : function() {
			alert(this.uarr)
		},
		getDarr : function() {
			alert(this.darr)
		},

		/* SETTERS */
		setClaseCssPrimero : function(nombre) {
			this.clase_css_primero = nombre
		},
		setClaseCssUltimo : function(nombre) {
			this.clase_css_ultimo = nombre
		},
		setClaseCssTabla : function(nombre) {
			this.clase_css_tabla = nombre
		},
		setClaseCssPar : function(nombre) {
			this.clase_css_par = nombre
		},
		setClaseCssImpar : function(nombre) {
			this.clase_css_impar = nombre
		},
		setClaseCssOrden : function(nombre) {
			this.clase_css_orden = nombre
		},
		setClaseCssFiltro : function(nombre) {
			this.clase_css_filtro = nombre
		},
		setClaseCssAcciones : function(nombre) {
			this.clase_css_acciones = nombre
		},
		setOrdenadoPor : function(campo) {
			this.ordenado_por = campo
		},
		setOrden : function(orden) {
			this.orden = orden
		},
		setCellpadding : function(x) {
			this.cellpadding
		},
		setCellspacing : function(x) {
			this.cellspacing
		},
		setAlign : function(alineacion) {
			this.align = alineacion
		},
		setWidth : function(x) {
			this.width = x
		},
		setBorder : function(x) {
			this.border = x
		},
		setLabelSinResultados : function(mensaje) {
			this.label_sin_resultados = mensaje
		},
		setLabelCantidadRegistros : function(mensaje) {
			this.label_cantidad_registros = mensaje
		},
		setLabelFiltro : function(mensaje) {
			this.label_filtro = mensaje
		},
		setColumnasNull : function() {
			this.columnas = Array()
		},
		setFilasNull : function() {
			this.filas = Array()
		},
		setCabeceraNull : function() {
			this.valores_cabecera = Array()
		},
		setUarr : function(caracter) {
			this.uarr = caracter
		},
		setDarr : function(caracter) {
			this.darr = caracter
		},
		setDatos : function() {
			if (Baldagrid.datos_serializados[0] > 0) {
				Baldagrid.paginador
						.setCantidadResultados(Baldagrid.datos_serializados[0]);
				Baldagrid.paginador.setRango();

				for ( var x = 1; x <= Baldagrid.datos_serializados.length - 1; x++)
					this.agregarFila(Baldagrid.datos_serializados[x], x);
			}
		},
		setOrdenamiento : function() {
			if (Baldagrid.tabla.orden == "ASC")
				Baldagrid.tabla.setOrden("DESC");
			else
				Baldagrid.tabla.setOrden("ASC");
		},
		setFlecha : function(columna) {
			if (this.orden == "ASC")
				columna.append(" ").append(this.uarr);
			else
				columna.append(" ").append(this.darr);
		},
		setAccion : function(nombre, url) {
			var accion = {
				nombre : nombre,
				url : url
			};
			this.acciones.push(accion);
		},
		setValoresCabecera : function() {
			if (typeof (Baldagrid.datos_serializados) == "object") {
				if (Baldagrid.datos_serializados[0] > 0) {
					var x = 0;
					for ( var key in Baldagrid.datos_serializados[1])
						this.valores_cabecera[x++] = key;
				} else
					this.mostrarSinResultados();
			} else {
				for ( var i in arguments)
					this.valores_cabecera[i] = arguments[i];
			}
		},
		primerColumna : function(nombre_columna) {
			var columna = $('<th></th>');
			columna.addClass(this.clase_css_primero);
			columna.addClass(nombre_columna);
			columna.css('cursor', 'pointer');
			columna.html(this.quitarGuiones(nombre_columna));

			if (this.ordenado_por == nombre_columna) {
				if (Baldagrid.usar_imagenes_css)
					columna.addClass(this.orden)
				else
					this.setFlecha(columna);
			}

			columna.click(function() {
				Baldagrid.tabla.setOrdenadoPor(nombre_columna);
				Baldagrid.tabla.setOrdenamiento();
				Baldagrid.crear();
			});

			this.columnas.push(columna);
		},
		ultimaColumna : function(nombre_columna) {
			var columna = $('<th></th>');
			columna.addClass(this.clase_css_ultimo);
			columna.addClass(nombre_columna);
			columna.css('cursor', 'pointer');
			columna.html(this.quitarGuiones(nombre_columna));

			if (this.ordenado_por == nombre_columna) {
				if (Baldagrid.usar_imagenes_css)
					columna.addClass(this.orden)
				else
					this.setFlecha(columna);
			}

			columna.click(function() {
				Baldagrid.tabla.setOrdenadoPor(nombre_columna);
				Baldagrid.tabla.setOrdenamiento();
				Baldagrid.crear();
			});

			this.columnas.push(columna);
		},
		ultimaColumnaAccion : function(nombre_columna) {
			var columna = $('<th></th>');
			columna.addClass(this.clase_css_ultimo);
			columna.addClass(nombre_columna);
			columna.attr('colspan', this.acciones.length);
			columna.html(this.quitarGuiones(nombre_columna));

			if (this.ordenado_por == nombre_columna) {
				if (Baldagrid.usar_imagenes_css)
					columna.addClass(this.orden)
				else
					this.setFlecha(columna);
			}

			this.columnas.push(columna);
		},
		agregarColumna : function(nombre_columna) {
			var columna = $('<th></th>');
			columna.addClass(nombre_columna);
			columna.css('cursor', 'pointer');
			columna.html(this.quitarGuiones(nombre_columna));

			if (this.ordenado_por == nombre_columna) {
				if (Baldagrid.usar_imagenes_css)
					columna.addClass(this.orden)
				else
					this.setFlecha(columna);
			}

			columna.click(function() {
				Baldagrid.tabla.setOrdenadoPor(nombre_columna);
				Baldagrid.tabla.setOrdenamiento();
				Baldagrid.crear();
			});

			this.columnas.push(columna);
		},
		agregarFila : function(registro, posicion) {
			var fila = $('<tr></tr>');
			fila.attr('id', registro.id)
			fila.addClass('tr');

			if (posicion == (Baldagrid.datos_serializados.length - 1))
				fila.addClass('final');

			if (posicion % 2 == 0)
				fila.addClass(this.clase_css_par);
			else
				fila.addClass(this.clase_css_impar);

			for ( var i in registro) {
				var columna = $('<td></td>');
				fila.append(columna.html(registro[i]));
			}

			this.filas.push(fila);
		},
		dibujar : function() {
			// Se dibuja la tabla
			var contenedor = $('<table></table>');
			contenedor.addClass(this.clase_css_tabla).attr( {
				'cellpadding' : this.cellpadding,
				'cellspacing' : this.cellspacing,
				'align' : this.align,
				'width' : this.width,
				'border' : this.border
			});

			/* INFORMACION */
			contenedor = this.informacion.crear(contenedor);
			/* CABECERA */
			contenedor = this.cabecera.crear(contenedor);
			/* REGISTROS */
			contenedor = this.registros.crear(contenedor);

			$('#' + Baldagrid.div_contenedora).append(contenedor);
		},
		cabecera : {

			crear : function(contenedor) {
				var fila = $('<tr></tr>');
				fila.addClass('cabecera');

				for (i in Baldagrid.tabla.columnas)
					fila.append(Baldagrid.tabla.columnas[i]);
				contenedor.append(fila);

				return contenedor;
			}
		},
		registros : {

			crear : function(contenedor) {
				for ( var i in Baldagrid.tabla.filas) {
					var fila = Baldagrid.tabla.filas[i];

					if (Baldagrid.tabla.acciones.length > 0) {
						for ( var x in Baldagrid.tabla.acciones) {
							var texto = $('<p></p>');
							texto.html($('<span></span>').html(
									Baldagrid.tabla.acciones[x].nombre));
							texto.addClass(Baldagrid.tabla.acciones[x].nombre);

							var columna_accion = $('<td></td>');
							columna_accion.html(texto);
							columna_accion
									.addClass(Baldagrid.tabla.clase_css_acciones);

							if (/\?/.test(Baldagrid.tabla.acciones[x].url))
								var url_a_redireccionar = Baldagrid.tabla.acciones[x].url
										+ '&id=' + fila.attr('id');
							else
								var url_a_redireccionar = Baldagrid.tabla.acciones[x].url
										+ '?id=' + fila.attr('id');

							columna_accion.attr('OnClick',
									"window.location = '" + url_a_redireccionar
											+ "'");
							fila.append(columna_accion);
						}
					}

					contenedor.append(fila);
				}

				return contenedor;
			}
		},
		informacion : {

			filtro_value : "",

			/* SETTERS */
			setFiltroValue : function(cadena) {
				this.filtro_value = cadena
			},

			/* GETTERS */
			getFiltroValue : function() {
				alert(this.filtro_value)
			},

			crear : function(contenedor) {
				// Se agrega la fila para mostrar los resultados y seleccion
				var fila = $('<tr></tr>');
				fila.addClass(Baldagrid.tabla.clase_css);
				fila.addClass('resultados');
				var columna = $('<td></td>');
				columna.attr( {
					'id' : 'resultados',
					'colspan' : Baldagrid.tabla.columnas.length
							+ Baldagrid.tabla.acciones.length
				});

				// Se agrega el select para la seleccion de los registros
				var registros = $('<span></span>');
				var select = $('<select></select>');
				var option = $('<option></option>');
				option.attr('value', 10).html(10);
				if (Baldagrid.paginador.cantidad_registros == option.val())
					option.attr('selected', 'selected');
				select.append(option);

				var option = $('<option></option>');
				option.attr('value', 25).html(25);
				if (Baldagrid.paginador.cantidad_registros == option.val())
					option.attr('selected', 'selected');
				select.append(option);

				var option = $('<option></option>');
				option.attr('value', 50).html(50);
				if (Baldagrid.paginador.cantidad_registros == option.val())
					option.attr('selected', 'selected');
				select.append(option);

				var option = $('<option></option>');
				option.attr('value', 100).html(100);
				if (Baldagrid.paginador.cantidad_registros == option.val())
					option.attr('selected', 'selected');
				select.append(option);

				select.change(function() {
					Baldagrid.paginador.setPaginaActual(1);
					Baldagrid.paginador.setCantidadRegistros(select.val());
					Baldagrid.crear();
				});

				registros.css('float', 'left').append(select);
				registros.prepend(Baldagrid.tabla.label_cantidad_registros);
				columna.append(registros);

				fila.append(columna);
				contenedor.append(fila);

				if (Baldagrid.filtro) {
					// Se agrega la fila para el filtro
					var fila = $('<tr></tr>');
					fila.addClass(Baldagrid.tabla.clase_css_filtro);
					var columna = $('<td></td>');
					columna.attr( {
						'id' : 'filtro',
						'colspan' : Baldagrid.tabla.columnas.length
								+ Baldagrid.tabla.acciones.length
					});

					var filtro = $('<input/>');
					filtro.attr('type', 'text');
					filtro.attr('name', 'filtro');
					filtro.attr('id', 'campo_filtro');
					filtro.attr('value', this.filtro_value);
					filtro.css('width',
							(parseInt(Baldagrid.tabla.width) / 2) + '%');
					filtro.addClass(Baldagrid.tabla.clase_css_filtro);
					filtro.keypress(function(event) {
						if (event.which == '13') {
							Baldagrid.ajax.data.filtro = filtro.val();
							Baldagrid.paginador.setPaginaActual(1);
							Baldagrid.crear();
						}
					});

					var limpiar = $('<button></button>');
					limpiar.append('Limpiar');
					limpiar.click(function() {
						filtro.val("");
						Baldagrid.ajax.data.filtro = "";
						Baldagrid.crear();
					});

					columna.prepend(Baldagrid.tabla.label_filtro)
					columna.append(filtro);
					columna.append(limpiar);
					fila.append(columna);
					contenedor.append(fila);
				}

				return contenedor;
			}
		},
		crear : function() {
			// Se limpia la div contenedora para la nueva tabla
		Baldagrid.limpiarDivContenedora();

		// Se verifica si los datos de la cabecera los crea dinamicamente de
		// la consulta o son definidos en un principio por el usuario
		if (this.valores_cabecera.length == 0)
			this.setValoresCabecera();

		// Se genera la cabecera
		for (i in this.valores_cabecera) {
			if (i == 0)
				this.primerColumna(this.valores_cabecera[i]);
			else if (i == (this.valores_cabecera.length - 1)) {
				if (this.acciones.length > 0) {
					this.agregarColumna(this.valores_cabecera[i]);
					this.ultimaColumnaAccion("Accion");
				} else
					this.ultimaColumna(this.valores_cabecera[i]);
			} else
				this.agregarColumna(this.valores_cabecera[i]);
		}

		this.dibujar();
	},
	destruir : function() {
		this.setColumnasNull();
		this.setFilasNull();
		this.setCabeceraNull();
	}
	},

	/**
	 * PAGINADOR
	 */
	paginador : {
		cantidad_paginas : 0,
		cantidad_resultados : 0,
		cantidad_registros : 10,
		pagina_actual : 1,
		clase_css : "pager",
		clase_css_pagina_actual : "pagina_seleccionada",
		clase_css_primero : "primero",
		clase_css_anterior : "anterior",
		clase_css_siguiente : "siguiente",
		clase_css_ultimo : "ultimo",
		clase_css_flechas : "flechas",
		pagina_inicio : 1,
		division : 20,
		rango : 0,
		plus : 0,
		paginas : Array(),
		laquo : "&laquo;",
		lsaquo : "&lsaquo;",
		raquo : "&raquo;",
		rsaquo : "&rsaquo;",

		/* GETTERS */
		getCantidadPaginas : function() {
			alert(this.cantidad_paginas)
		},
		getCantidadResultados : function() {
			alert(this.cantidad_resultados)
		},
		getCantidadRegistros : function() {
			alert(this.cantidad_registros)
		},
		getPaginaActual : function() {
			alert(this.pagina_actual)
		},
		getClaseCss : function() {
			alert(this.clase_css)
		},
		getClaseCssPaginaActual : function() {
			alert(this.clase_css_pagina_actual)
		},
		getClaseCssPrimero : function() {
			alert(this.clase_css_primero)
		},
		getClaseCssAnterior : function() {
			alert(this.clase_css_anterior)
		},
		getClaseCssSiguiente : function() {
			alert(this.clase_css_siguiente)
		},
		getClaseCssUltimo : function() {
			alert(this.clase_css_ultimo)
		},
		getPaginaInicio : function() {
			alert(this.pagina_inicio)
		},
		getDivision : function() {
			alert(this.division)
		},
		getRango : function() {
			alert(this.rango)
		},
		getLaquo : function() {
			alert(this.laquo)
		},
		getLsaquo : function() {
			alert(this.lsaquo)
		},
		getRaquo : function() {
			alert(this.raquo)
		},
		getRsaquo : function() {
			alert(this.rsaquo)
		},
		getUnaSolaPagina : function() {
			var contenedorTr = $('<tr></tr>');
			contenedorTr.addClass(this.clase_css);
			var contenedorTd = $('<td></td>');
			contenedorTd.attr('colspan', Baldagrid.tabla.columnas.length
					+ Baldagrid.tabla.acciones.length);
			contenedorTd.html($('<span></span>').addClass(
					this.clase_css_pagina_actual).html(this.pagina_inicio));

			var contenedor = contenedorTr.append(contenedorTd);
			$('#' + Baldagrid.div_contenedora).find('table').append(contenedor);
		},

		/* SETTERS */
		setCantidadResultados : function(x) {
			this.cantidad_resultados = x
		},
		setCantidadRegistros : function(x) {
			this.cantidad_registros = x
		},
		setPaginaActual : function(x) {
			this.pagina_actual = x
		},
		setDivision : function(x) {
			this.division = x
		},
		setClaseCss : function(nombre) {
			this.clase_css = nombre
		},
		setClaseCssPaginaActual : function(nombre) {
			this.clase_css_pagina_actual = nombre
		},
		setClaseCssPrimero : function(nombre) {
			this.clase_css_primero = nombre
		},
		setClaseCssAnterior : function(nombre) {
			this.clase_css_anterior = nombre
		},
		setClaseCssSiguiente : function(nombre) {
			this.clase_css_siguiente = nombre
		},
		setClaseCssUltimo : function(nombre) {
			this.clase_css_ultimo = nombre
		},
		setPaginasNull : function() {
			this.paginas = Array()
		},
		setPaginaInicio : function(x) {
			this.pagina_inicio = x
		},
		setRango : function(x) {
			this.rango = x
		},
		setPaginaInicio : function(x) {
			this.pagina_inicio = x
		},
		setPaginacion : function() {
			this.setCantidadPaginas();

			if ((this.pagina_actual + (this.division / 2)) <= this.cantidad_paginas)
				this.setRango(this.pagina_actual + (this.division / 2));
			else
				this.setRango(this.cantidad_paginas);

			if ((this.pagina_actual - (this.division / 2)) <= 0)
				this.setPaginaInicio(1);
			else
				this.setPaginaInicio(this.pagina_actual - (this.division / 2));
		},
		setCantidadPaginas : function() {
			this.cantidad_paginas = Math.ceil(this.cantidad_resultados
					/ this.cantidad_registros);
		},
		setNumero : function(x) {
			var numero = $('<span></span>');
			numero.css('cursor', 'pointer');
			numero.attr('id', x);
			numero.html(x);
			numero.click(function() {
				Baldagrid.paginador.setPaginaActual(x);
				Baldagrid.crear();
			});

			if (x == this.pagina_actual)
				numero.addClass(this.clase_css_pagina_actual);

			return numero;
		},
		setNumeracion : function() {
			var contenedorTr = $('<tr></tr>');
			contenedorTr.addClass(this.clase_css);
			var contenedorTd = $('<td></td>');
			contenedorTd.attr('colspan', Baldagrid.tabla.columnas.length
					+ Baldagrid.tabla.acciones.length);

			for ( var i = this.pagina_inicio; i <= this.rango; i++) {
				if (i < this.rango) {
					var guion = $('<span></span>').html(' - ');
					this.paginas.push(this.setNumero(i).after(guion));
				} else
					this.paginas.push(this.setNumero(i));
			}

			this.setBotoneraIzquierda(contenedorTd);

			for (i in this.paginas) {
				contenedorTd.append(this.paginas[i]);
				if (this.paginas[i] == this.pagina_actual)
					contenedorTd.addClass(this.clase_css_pagina_actual);
			}

			this.setBotoneraDerecha(contenedorTd);

			var contenedor = contenedorTr.append(contenedorTd);

			$('#' + Baldagrid.div_contenedora).find('table').append(contenedor);
		},
		setBotoneraIzquierda : function(contenedorTd) {
			if (this.pagina_actual > this.pagina_inicio) {
				this.setAnterior(contenedorTd);

				if (this.pagina_actual > ((this.division / 2) + 1))
					this.setPrimero(contenedorTd);
			}
		},
		setBotoneraDerecha : function(contenedorTd) {
			if (this.pagina_actual < this.cantidad_paginas)
				this.setSiguiente(contenedorTd);

			if ((this.pagina_actual + (this.division / 2)) < this.cantidad_paginas)
				this.setUltimo(contenedorTd);
		},
		setPrimero : function(contenedorTd) {
			var primero = $('<span></span>');
			primero.addClass(this.clase_css_flechas);
			primero.css('cursor', 'pointer');

			if (Baldagrid.usar_imagenes_css)
				primero.addClass(this.clase_css_primero);
			else
				primero.html(this.laquo);

			primero.click(function() {
				Baldagrid.paginador.setPaginaActual(1);
				Baldagrid.crear();
			});

			contenedorTd.prepend(primero);

			return contenedorTd;
		},
		setAnterior : function(contenedorTd) {
			var anterior = $('<span></span>');
			anterior.addClass(this.clase_css_flechas);
			anterior.css('cursor', 'pointer');

			if (Baldagrid.usar_imagenes_css)
				anterior.addClass(this.clase_css_anterior);
			else
				anterior.html(this.lsaquo);

			anterior
					.click(function() {
						Baldagrid.paginador
								.setPaginaActual(Baldagrid.paginador.pagina_actual - 1);
						Baldagrid.crear();
					});

			contenedorTd.prepend(anterior);

			return contenedorTd;
		},
		setSiguiente : function(contenedorTd) {
			var siguiente = $('<span></span>');
			siguiente.addClass(this.clase_css_flechas);
			siguiente.css('cursor', 'pointer');

			if (Baldagrid.usar_imagenes_css)
				siguiente.addClass(this.clase_css_siguiente);
			else
				siguiente.html(this.rsaquo);

			siguiente
					.click(function() {
						Baldagrid.paginador
								.setPaginaActual(Baldagrid.paginador.pagina_actual + 1);
						Baldagrid.crear();
					});

			contenedorTd.append(siguiente);

			return contenedorTd;
		},
		setUltimo : function(contenedorTd) {
			var ultimo = $('<span></span>');
			ultimo.addClass(this.clase_css_flechas);
			ultimo.css('cursor', 'pointer');

			if (Baldagrid.usar_imagenes_css)
				ultimo.addClass(this.clase_css_ultimo);
			else
				ultimo.html(this.raquo);

			ultimo.click(function() {
				Baldagrid.paginador
						.setPaginaActual(Baldagrid.paginador.cantidad_paginas);
				Baldagrid.crear();
			});

			contenedorTd.append(ultimo);

			return contenedorTd;
		},
		crear : function() {
			if (this.cantidad_resultados > this.cantidad_registros) {
				this.setPaginacion();
				this.setNumeracion();
			} else
				this.getUnaSolaPagina();
		},
		destruir : function() {
			this.setPaginasNull();
		}
	},

	/**
	 * RESULTADOS
	 */
	resultado : {

		tiempo : 0,
		clase_css : "resultado",
		resultado : "",

		/* GETTERS */
		getTiempo : function() {
			alert(this.tiempo)
		},
		getClaseCss : function() {
			alert(this.clase_css)
		},
		getResultado : function() {
			alert(this.resultado)
		},

		/* SETTERS */
		setTiempo : function(x) {
			this.tiempo = x
		},
		setClaseCss : function(nombre) {
			this.clase_css = nombre
		},
		setResultado : function(resultado) {
			this.resultado = resultado
		},

		crear : function() {
			this.setResultado("Se encontraron <b>"
					+ Baldagrid.paginador.cantidad_resultados
					+ "</b> registros en " + this.tiempo + " milisegundos");
			var contenedor = $('<span></span>');
			contenedor.attr('id', 'resultado');
			contenedor.css('float', 'right');
			contenedor.css('margin', 3);
			contenedor.html(this.resultado);
			$('#resultados').append(contenedor);
		}
	},

	/**
	 * BLOQUEO
	 */
	bloqueo : {

		clase_css : "block",
		clase_css_mensaje : "centrar",

		/* GETTERS */
		getClaseCss : function() {
			alert(this.clase_css)
		},
		getClaseCssMensaje : function() {
			alert(this.clase_css_mensaje)
		},

		/* SETTERS */
		setClaseCss : function(nombre) {
			this.clase_css = nombre
		},
		setClaseCssMensaje : function(nombre) {
			this.clase_css_mensaje = nombre
		},

		crear : function() {
			var contenedor = $('<div></div>');
			contenedor.attr('id', 'block');
			contenedor.addClass(this.clase_css);

			var mensaje = $('<div></div>');
			mensaje.addClass(this.clase_css_mensaje);
			mensaje.attr('id', 'mensaje');
			mensaje.html(Baldagrid.procesando);

			$('html').prepend(contenedor).append(mensaje);
		},
		destruir : function() {
			$('#mensaje').remove();
			$('#block').remove();
		}
	}
}